<!doctype html>
<html>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width initial-scale=1'>
<meta name="author" content="RainPPR" />
<meta name="description" content="语义化版本规范" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="语义化版本 2.0.0" />
<meta property="og:title" content="语义化版本 2.0.0" />
<meta property="og:description" content="语义化版本规范" />
<meta property="og:site_name" content="语义化版本" />
<meta property="og:type" content="website" />
<link href='style.css' rel='stylesheet' type='text/css' />
<link href='font.css' rel='stylesheet' type='text/css' />
<title>语义化版本</title>
</head>
<body class='typora-export os-windows'><div class='typora-export-content'>
<div id='write'  class=''><h1 id='center语义化版本center'><center><span>语义化版本</span></center></h1><h4 id='p-alignright200p'><p align="right"><span>2.0.0</span></p></h4><p><strong><span>SemVer</span></strong><span>（Semantic Versioning Specification，</span><strong><span>语义化版本命名规范</span></strong><span>）是目前较为流行的命名版本的规范。</span></p><p><span>语义化版本通过一组简单的规则及条件来约束版本号的配置和增长。这些规则是根据（但不局限于）已经被各种封闭、开发源码软件所广泛使用的惯例所设计。</span></p><h2 id='center摘要center'><center><span>摘要</span></center></h2><p><span>版本格式：</span><strong><span>主版本号.次版本号.修订号</span><em><span>〔-先行版本号+编译信息〕</span></em></strong><span>，版本号递增规则如下：</span></p><ol start='' ><li><span>主版本号（</span><strong><span>Major</span></strong><span> 版本），版本迭代，当你做了与前版本不兼容修改；</span></li><li><span>次版本号（</span><strong><span>Minor</span></strong><span> 版本），更新功能，不应该有兼容问题，或向下兼容的功能性新增；</span></li><li><span>修订号（</span><strong><span>Patch</span></strong><span> 版本），修复 Bug，更小程度的变动，不会有兼容问题。</span></li></ol><p><span>延伸（Extensions）：</span></p><ol start='4' ><li><span>先行版本号（</span><strong><span>Pre-release</span></strong><span>），预发布版本，正式发布前的不稳定版本，用于内部、社区、提前体验的用户；</span></li><li><span>编译信息（</span><strong><span>Build metadata</span></strong><span>），编译环境、时间等。</span></li></ol><h2 id='center规范center'><center><span>规范</span></center></h2><h4 id='开发阶段'><span>开发阶段</span></h4><ol start='' ><li><span>主版本号为零（0.Y.Z）的软件处于开发初始阶段，一切都可能随时被改变，这不应该被视为稳定版。</span></li></ol><ol start='2' ><li><span>在 0.y.z 初始开发阶段，以 0.1.0 作为你的</span><strong><span>初始化开发版本</span></strong><span>，并在后续的每次发行时</span><strong><span>递增次版本号</span></strong><span>。</span></li></ol><ol start='3' ><li><p><strong><span>先行版本号</span></strong><span>可以被标注在修订版之后，先加上一个连接号再加上一连串以句点分隔的标识符来修饰。标识符必须由 ASCII 字母数字和连接号 [0-9，A-Z，a-z，-] 组成，且禁止留白。数字型的标识符禁止在前方补零。先行版本号一般为这些单词：</span></p><ul><li><strong><span>Snapshot</span></strong><span>：快照（开发版）</span>
<span>处于开发阶段。这个版本的代码禁止用于生产环境。</span></li><li><strong><span>Alpha</span></strong><span>（α）：内测版</span>
<span>内部交流或专业测试人员测试使用。</span></li><li><strong><span>Preview</span></strong><span>：预览版</span>
<span>与 Alpha 类似，有时还会细分 M1，M2 版本。</span></li><li><strong><span>Beta</span></strong><span>（β）：公测版</span>
<span>专业爱好者大规模测试使用，存在一些 Bug，不适合一般用户使用。</span></li><li><strong><span>Gamma</span></strong><span>（λ）：比较成熟的测试版</span></li><li><strong><span>RC</span></strong><span>（Release Candidate）：候选版本，以前叫做 Gama</span>
<span>处于测试阶段，该版本已经完成了全部功能并清除了大量的 Bug。</span>
<span>到了这个阶段，只会修复 Bug，不会对软件做任何大的更改。</span></li><li><strong><span>Release</span></strong><span>（Stable）：发行版本（稳定版）</span>
<span>正式发行的版本，已经经过测试，一般不会出现严重的 Bug，适合一般用户使用。</span>
<span>对于不开源的软件， Release 可能是带有免费使用时间限制的版本。</span></li><li><span>一般来说，Alpha -&gt; Beta -&gt; Gamma 是迭代的关系，RC1 -&gt; RC2 是取舍的关系。</span></li></ul></li></ol><h4 id='发行阶段'><span>发行阶段</span></h4><ol start='' ><li><span>版本号必须为</span><strong><span>非负的整数</span></strong><span>，且禁止在数字前方</span><strong><span>补零</span></strong><span>。每个元素必须以数值来</span><strong><span>递增</span></strong><span>。</span></li></ol><ol start='2' ><li><span>标记版本号的软件发行后，</span><strong><span>禁止改变</span></strong><span>该版本软件的内容。任何修改都必须以新版本发行。</span></li></ol><ol start='3' ><li><span>每当次版本号递增时，修订号必须</span><strong><span>归零</span></strong><span>。</span></li><li><span>每当主版本号递增时，次版本号和修订号必须</span><strong><span>归零</span></strong><span>。</span></li></ol><ol start='5' ><li><strong><span>版本编译信息</span></strong><span>可以被标注在修订版或先行版本号之后，先加上一个加号再加上一连串以句点分隔的标识符来修饰。标识符必须由 ASCII 字母数字和连接号 [0-9，A-Z，a-z，-] 组成，且禁止留白。范例：1.0.0-alpha</span><strong><span>+001</span></strong><span>、1.0.0</span><strong><span>+20130313144700</span></strong><span>、1.0.0-beta</span><strong><span>+exp.sha.5114f85</span></strong><span>。</span></li></ol><ol start='6' ><li><span>在语义化版本号之前增加</span><strong><span>前缀 “v”</span></strong><span> 是用来表示版本号的常用做法，但“vX.Y.Z”不是的一个语义化的版本号，通常用作标签名称。</span></li></ol><ol start='7' ><li><span>当你弃用部份公共 API 时，你应该做两件事：</span>
<span>（1）更新你的</span><strong><span>文档</span></strong><span>让使用者知道这个改变；</span>
<span>（2）在适当的时机将弃用的功能透过新的次版本号</span><strong><span>发布</span></strong><span>。在新的主版本完全移除弃用功能前，至少要有一个次版本包含这个</span><strong><span>弃用信息</span></strong><span>，这样使用者才能平顺地转移到新版 API。</span></li></ol><ol start='8' ><li><p><span>版本的优先层级指的是不同版本在排序时如何比较。</span></p><ol start='' ><li><p><span>判断优先层级时，必须把版本依序</span><strong><span>拆分</span></strong><span>为主版本号、次版本号、修订号及先行版本号后进行比较（版本编译信息不在这份比较的列表中）。</span></p></li><li><p><span>由左到右</span><strong><span>依序比较</span></strong><span>每个标识符，第一个差异值用来决定优先层级：主版本号、次版本号及修订号以数值比较。</span></p><p><span>例如：1.0.0 &lt; 2.0.0 &lt; 2.1.0 &lt; 2.1.1。</span></p></li><li><p><span>当主版本号、次版本号及修订号都相同时，改以优先层级比较低的</span><strong><span>先行版本号</span></strong><span>决定。</span></p><p><span>例如：1.0.0-alpha &lt; 1.0.0-alpha.1 &lt; 1.0.0-alpha.beta &lt; 1.0.0-beta &lt; 1.0.0-beta.2 &lt; 1.0.0-beta.11 &lt; 1.0.0-rc.1 &lt; 1.0.0。</span></p></li></ol></li><li><p><span>一旦发现自己破坏了语义化版本控制的规范，就要</span><strong><span>修正</span></strong><span>这个问题，并发行一个新的次版本号来更正这个问题并且恢复向下兼容。即使是这种情况，也不能去修改已发行的版本。可以的话，将有问题的版本号记录到文档中，告诉使用者问题所在，让他们能够意识到这是有问题的版本。</span></p></li></ol><hr><p><span>官方版见：</span><a href='https://semver.org/'><span>https://semver.org/</span></a>
<span>中文版见：</span><a href='https://semver.org/lang/zh-CN/'><span>https://semver.org/lang/zh-CN/</span></a>
<span>文档整理：</span><a href='https://gitee.com/RainPPR/'><span>RainPPR</span></a></p></div></div>
</body>
</html>